/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gerenciadorprojetos.services;

import gerenciadorprojetos.dao.hibernate.UsuarioDAO;
import gerenciadorprojetos.dao.Usuario;
import gerenciadorprojetos.exception.UsuarioServiceException;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import org.apache.log4j.Logger;

/**
 *
 * @author eduardo
 */
public class UsuarioService {
    
    private UsuarioDAO userdao;
    private Logger logger = Logger.getLogger(UsuarioService.class);
    
    public Usuario getUsuarioLogado() {
        try {
            return getUserdao().obtemUsuarioPorApelido(System.getProperty("user.name"));
        } catch (RuntimeException e) {
            logger.error("Erro ao bucar o usuario logado !");
            logger.error("Mensagem: "+e.getMessage());
            return null;
        }     
    }
    
    public String getNomeUsuarioLogado() {
        try {
            Usuario aux = getUserdao().obtemUsuarioPorApelido(System.getProperty("user.name"));
            return new StringBuilder().append(aux.getIdUsuario()).append(" - ").append(aux.getNomeUsuario()).toString();
        } catch (RuntimeException e) {
            logger.error("Erro ao bucar o nome do usuario logado !");
            logger.error("Mensagem: "+e.getMessage());
            return null;
        }     
    }
    
    public String getApelidoUsuarioLogado() {
        try {
            return getUserdao().obtemUsuarioPorApelido(System.getProperty("user.name")).getApelidoUsuario();
        } catch (RuntimeException e) {
            logger.error("Erro ao bucar o apelido do usuario logado !");
            logger.error("Mensagem: "+e.getMessage());
            return null;
        }     
    }

    public UsuarioDAO getUserdao() {
        return userdao;
    }

    public void setUserdao(UsuarioDAO userdao) {
        this.userdao = userdao;
    }
    
    public List<String> getUsuarios() {
        try {
            List<Usuario> l = userdao.obtemUsuarios();
            ListIterator<Usuario> i = l.listIterator();

            List<String> s = new LinkedList<String>();

            while (i.hasNext()) {
                Usuario u = i.next();
                s.add(u.getIdUsuario() + " - " +u.getNomeUsuario());
            }

            return  s;
        } catch (RuntimeException e) {
            logger.error("Erro ao bucar os usuarios do sistema !");
            logger.error("Mensagem: "+e.getMessage());
            return null;
        } 
    }

    public String getUsuarioLogadoString() {
        Usuario u = this.getUsuarioLogado();

        return u.getIdUsuario() + " - " +u.getNomeUsuario();
    }
    
    public String addUsuario(String nome, String senha, String email, String apelido, String responsavel) throws UsuarioServiceException {
        Usuario aux = getUserdao().obtemUsuarioPorApelido(apelido);
        
        if (aux != null) {
            throw new UsuarioServiceException(UsuarioServiceException.APELIDO_JA_EXISTENTE);
        }
        
        Usuario user = new Usuario();
        
        if (responsavel != null && (! "".equals(responsavel))) {
            
            aux = getUserdao().obtemUsuarioPorId(Integer.parseInt(responsavel.substring(0, responsavel.indexOf("-")).trim()));
            
            if (aux != null) {
                user.setUsuario(aux);
            } else {
                logger.error("O responsável não foi encontrado ! Responsavel:"+ responsavel);
                throw new UsuarioServiceException(UsuarioServiceException.RESPONSAVEL_INEXISTENTE);
            }
        } else {
            logger.debug("O responsável não foi informado !");
        }
        
        user.setNomeUsuario(nome);
        user.setEmailUsuario(email);
        user.setApelidoUsuario(apelido);
        int id = getUserdao().obterMaxID()+1;
        user.setIdUsuario(id);
        
        if (! getUserdao().addUsuario(user)) {
            logger.error("Ocorreu um erro ao cadastrar o usuario !");
            throw new UsuarioServiceException(UsuarioServiceException.ERRO_CADASTRO_USUARIO);
        }
        
        return id+"";
    }

}
